[자바의 신] 9장: 자바를 배우려면 접근 제어자는 꼭 알아야해요¶
패키지¶
자바에서는 비슷한 기능이나 비슷한 역할을 하는 클래스를 패키지로 묶어 관리한다.
클래스는 같은 패키지에 있는 클래스와 java.lang 패키지에 있는 클래스를 import
하지 않아도 사용할 수 있다.
다른 패키지에 있는 클래스를 사용할 때는 import
키워드로 사용할 패키지를 불러와야 한다.
만약 static 메서드나 클래스 변수만을 가져와서 사용하고 싶다면 import static
키워드를 사용하면 된다.
다음은 자바에서 패키지를 선언하고 import 하여 사용하는 예시 코드이다.
package example.javapackge; // 패키지 선언은 파일 맨 위에 작성되어야 한다.
// 패키지 import
import java.io.*;
// 클래스 변수 import
import static java.lang.Math.PI;
public class JavaPackage {
// ...생략
}
접근 제어자¶
자바의 접근 제어자는 총 4가지로, 클래스, 메서드, 변수의 접근 권한을 지정하는 용도로 사용된다.
- public: 어떤 곳에서도 사용될 수 있다.
- protected: 같은 패키지에 있는 클래스와 상속한 클래스에서만 사용할 수 있다.
- package-private: 같은 패키지에 있는 클래스에서만 사용할 수 있다. 접근 제어자를 붙이지 않으면 package-private이 지정된다.
- private: 해당 클래스의 내부에서만 사용할 수 있다.
주로 아래와 같은 이유로 접근 제어자를 사용한다.
- 변수에 접근 제어자를 사용할 때: 변수를 private으로 선언하여 다른 곳에서 직접 값을 변경할 수 없도록 한다. private으로 선언된 변수는 변수가 위치한 클래스의 메서드를 통해 수정할 수 있도록 한다.
- 메서드에 접근 제어자를 사용할 때: 구현한 메서드가 다른 곳에서 호출되는 것을 제한하기 위해서 사용한다.
package godofjava.example.sub;
public class AccessModifier {
public void publicMethod() {}
protected void protectedMethod() {}
void packagePrivateMethod() {}
private void privateMethod() {}
}
package godofjava.example;
import godofjava.example.sub.AccessModifier;
public class AccessCall {
public static void main(String args[]) {
AccessModifier accessModifier = new AccessModifier();
accessModifier.publicMethod();
accessModifier.protectedMethod(); // 상속하지 않았고, 같은 패키지가 아니기 때문에 컴파일 에러 발생
accessModifier.packagePrivateMethod(); // 같은 패키지가 아니기 때문에 컴파일 에러 발생
accessModifier.privateMethod(); // private method를 AccessModifier가 아닌 곳에서 호출했기 때문에 컴파일 에러 발생
}
}
클래스 접근 제어자 선언 시 유의점¶
클래스에서 접근 제어자를 사용할 때 주의해야 할 점이 하나 있다. 소스 파일에 public으로 선언된 클래스가 있다면, 그 소스 파일의 이름은 반드시 public인 클래스와 동일해야 한다. 만약 public인 클래스와 소스 파일명이 다르다면 컴파일 에러가 발생한다.
예를 들어 아래 PublicClass.java 파일에서는 PublicClass가 public이 아니지만, SubClass가 public으로 선언되어 있기 때문에 컴파일 오류가 발생한다. 이 경우 파일명이 SubClass.java여야 한다.
// PublicClass.java 파일
package godofjava.example;
class PublicClass {
}
public class SubClass {}
되도록이면, 자바에 익숙해지기 전에는 클래스 소스 하나에 하나의 클래스를 선언해서 개발하는 습관을 갖기를 권장한다.